home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / INCLUDE.HAS < prev    next >
Text File  |  1996-08-13  |  5KB  |  231 lines

  1. size_of_isi:    equ    7*4+56        *付加情報のサイズ
  2. include_file:                *.INCLUDE(インクルード)
  3. *    bsr    check_relation_cmn    *コマンド関係チェック
  4.     bsr    skip_eq
  5.     cmp.l    a4,d4
  6.     bls    m_missing_filename    *ファイルネームがありません
  7.     cmpi.b    #'{',(a4)        *'{'で始まっているかどうか
  8.     seq    d2
  9.     bne    @f
  10.     addq.w    #1,a4
  11. @@:
  12.     moveq.l    #0,d1            *len
  13.     moveq.l    #0,d3            *拡張子マーク
  14.     move.l    temp_buffer-work(a6),a2
  15. infnlp:                    *ファイルネームの取得
  16.     cmp.l    a4,d4
  17.     bls    exit_gtiffn
  18.     cmpi.b    #' ',(a4)
  19.     bls    exit_gtiffn
  20.     move.b    (a4)+,d0
  21.     bsr    chk_kanji
  22.     bpl    @f
  23.     move.b    d0,(a2)+
  24.     cmp.l    a4,d4
  25.     bls    m_kanji_break_off
  26.     move.b    (a4)+,(a2)+
  27.     addq.l    #2,d1
  28.     bra    infnlp
  29. @@:
  30.     cmpi.b    #'.',d0
  31.     bne    @f
  32.     move.l    a2,d3
  33. @@:
  34.     move.b    d0,(a2)+
  35.     addq.l    #1,d1
  36.     bra    infnlp
  37. exit_gtiffn:
  38.     cmpi.b    #'.',-1(a2)
  39.     beq    @f            *最後の文字が'.'
  40.     tst.l    d3
  41.     bne    2f
  42.     bra    1f
  43. @@:
  44.     subq.w    #1,a2
  45. 1:
  46.     move.b    #'.',(a2)+
  47.     move.b    #'Z',(a2)+
  48.     move.b    #'M',(a2)+
  49.     move.b    #'C',(a2)+
  50. 2:
  51.     tst.b    d2            *'{'で始まっている場合は最後の文字が
  52.     beq    @f            *'}'である必要がある
  53.     cmpi.b    #'}',-(a2)
  54.     bne    m_illegal_command_line
  55.     subq.l    #1,d1            *文字長が0ではだめ
  56.     ble    m_missing_filename
  57. @@:
  58.     clr.b    (a2)+            *end code
  59.     addq.l    #1,d1
  60.                     *>d1.l=filename length
  61.     add.l    #size_of_isi,d1        *付加情報分のサイズも加算して今回のワーク占有量を算出
  62.     move.l    erfn_addr-work(a6),a1
  63.     move.l    erfn_now-work(a6),d2
  64.     add.l    d1,d2
  65.     cmp.l    erfn_size-work(a6),d2
  66.     bcs    cpy_fn_to_erfn
  67.                     *ファイルネームバッファ拡張
  68.     move.l    a0,-(sp)
  69.     jsr    enlarge_mem-work(a6)
  70.     tst.l    d0
  71.     bmi    m_out_of_memory
  72.     move.l    d2,erfn_size-work(a6)
  73.     move.l    a0,erfn_addr-work(a6)
  74.     move.l    a0,a1
  75.     move.l    (sp)+,a0
  76. cpy_fn_to_erfn:                    *読み込みファイルネームを関連ワークへ保存
  77.     add.l    erfn_now-work(a6),a1
  78.     move.l    temp_buffer-work(a6),a2
  79.     addq.l    #1,zms_file_id-work(a6)
  80.     bcs    m_too_many_include_files
  81. *    move.l    a1,erfn_recent0-work(a6)    *現在コンパイル中のファイル名
  82. @@:                        *ファイルネームをファイルネームバッファへ退避
  83.     move.b    (a2)+,(a1)+
  84.     bne    @b
  85.     move.l    a1,d0
  86.     addq.l    #1,d0
  87.     bclr.l    #0,d0            *.even
  88.     move.l    d0,a1
  89. *    sub.l    erfn_addr-work(a6),d0    *いちおうセット
  90. *    move.l    d0,erfn_now-work(a6)
  91.     moveq.l    #size_of_isi/4-1,d0
  92. @@:
  93.     clr.l    (a1)+            *初期化
  94.     dbra    d0,@b
  95.     lea    -size_of_isi(a1),a1    *戻す
  96.  
  97.     move.l    temp_buffer-work(a6),a2
  98.     jsr    fopen-work(a6)        *>d5.l=file handle
  99.     tst.l    d5
  100.     bmi    m_file_not_found
  101.  
  102.     jsr    get_fsize-work(a6)    *>d3.l=file size
  103.  
  104.     move.l    d3,d2
  105.     move.l    #ID_TEMP,d3
  106.     movem.l    d2/a0,-(sp)            *push true size,fn buffer
  107.     jsr    get_mem-work(a6)
  108.     tst.l    d0
  109.     bmi    m_out_of_memory
  110. prsv_isi:                    *isi(information of sub include file)保存
  111. *    move.l    a1,erfn_recent1-work(a6)    *最新isi付加情報アドレス
  112.     move.l    a0,(a1)+            *読み込んだファイルのアドレス
  113.     move.l    d2,(a1)+            *読み込んだファイルの長さ(d2:LW BORDER SIZE)
  114.     move.l    d4,(a1)+            *親ソースの最終アドレス保存
  115.     move.l    a4,(a1)+            *親ソースのコンパイルアドレス保存
  116.     move.l    line_number-work(a6),(a1)+
  117.     move.l    line_ptr-work(a6),(a1)+
  118.     move.l    line_locate-work(a6),(a1)+
  119.     lea    file_info_buf-work(a6),a2
  120.     moveq.l    #56/4-1,d0
  121. @@:
  122.     move.l    (a2)+,(a1)+
  123.     dbra    d0,@b
  124.     bsr    check_include_error
  125.     sub.l    erfn_addr-work(a6),a1
  126.     move.l    erfn_now-work(a6),d3        *backup
  127.     move.l    a1,erfn_now-work(a6)
  128.     tst.l    d0
  129.     bpl    @f
  130.     subq.l    #1,zms_file_id-work(a6)
  131.     move.l    d3,erfn_now-work(a6)
  132.     movem.l    (sp)+,d3/a0
  133.     bra    m_recusive_include_error
  134. @@:
  135.     move.l    (sp)+,d3        *get true size
  136.     ifndef    sv
  137.     move.w    sr,-(sp)
  138.     andi.w    #$f8ff,sr
  139.     endif
  140.     move.l    d3,-(sp)        *push size
  141.     move.l    a0,-(sp)        *push addr
  142.     move.w    d5,-(sp)        *file handle
  143.     DOS    _READ            *ソース読み込み
  144.     lea    10(sp),sp
  145.     ifndef    sv
  146.     move.w    (sp)+,sr
  147.     endif
  148.  
  149.     jsr    do_fclose-work(a6)
  150.  
  151.     move.l    a0,a4
  152.     add.l    d3,a0
  153.     move.l    a0,d4
  154.     move.l    #1,line_number-work(a6)
  155.     move.l    a4,line_ptr-work(a6)
  156.     move.l    a4,line_locate-work(a6)
  157.  
  158.     move.l    (sp)+,a0
  159.     addq.l    #1,include_depth-work(a6)
  160.     bra    cmpl_lp
  161.  
  162. check_include_error:            *重複インクルードチェック
  163.     * > d0.l=minus:error
  164. reglist    reg    a1-a4
  165.     movem.l    reglist,-(sp)
  166.     move.l    erfn_addr-work(a6),a1    *check 無限再帰
  167.     move.l    erfn_now-work(a6),d0
  168.     lea    (a1,d0.l),a3        *end addr
  169. cielp00:
  170.     cmp.l    a3,a1
  171.     bcc    cie_normal
  172. @@:
  173.     tst.b    (a1)+            *filename skip
  174.     bne    @b
  175.     move.l    a1,d0
  176.     addq.l    #1,d0
  177.     bclr.l    #0,d0            *.even
  178.     move.l    d0,a1
  179.     lea    7*4(a1),a1        *情報部分をポイント
  180.     lea    56(a1),a4        *次のisi->a4.l
  181.     lea    file_info_buf-work(a6),a2
  182.     moveq.l    #54/2-1,d0
  183. @@:
  184.     cmpm.w    (a2)+,(a1)+
  185.     bne    @f
  186.     dbra    d0,@b
  187.     moveq.l    #-1,d0            *error case
  188.     movem.l    (sp)+,reglist
  189.     rts
  190. @@:
  191.     move.l    a4,a1
  192.     bra    cielp00
  193. cie_normal:
  194.     moveq.l    #0,d0            *normal case
  195.     movem.l    (sp)+,reglist
  196.     rts
  197.  
  198. pop_include_ope:                *インクルードしたファイルが
  199. reglist    reg    d0-d1/a2
  200.     movem.l    reglist,-(sp)
  201. *    move.l    erfn_recent1-work(a6),d0    *コンパイル終了するとここへくる
  202. *    beq    cmpl_lp
  203. *    clr.l    erfn_recent0-work(a6)    *初期化
  204. *    clr.l    erfn_recent1-work(a6)    *初期化
  205.     move.l    erfn_addr-work(a6),a2
  206. *    add.l    erfn_now-work(a6),a2
  207. *!    move.l    include_depth-work(a6),d1
  208.     move.l    zms_file_id-work(a6),d1
  209. @@:
  210.     tst.b    (a2)+
  211.     bne    @b
  212.     move.l    a2,d0
  213.     addq.l    #1,d0
  214.     bclr.l    #0,d0            *.even
  215.     move.l    d0,a2
  216.     subq.l    #1,d1
  217.     beq    @f
  218.     lea    size_of_isi(a2),a2
  219.     bra    @b
  220. @@:
  221.     addq.l    #8,a2            *アドレス,サイズスキップ
  222.     move.l    (a2)+,d4        *親ソースの終了アドレス
  223.     move.l    (a2)+,a4        *親ソースのコンパイルアドレス
  224.     move.l    (a2)+,line_number-work(a6)
  225.     move.l    (a2)+,line_ptr-work(a6)
  226.     move.l    (a2)+,line_locate-work(a6)
  227.     subq.l    #1,include_depth-work(a6)
  228.     movem.l    (sp)+,reglist
  229.     bra    cmpl_lp
  230.  
  231.